/**
 * js常用工具
 *
 */

const Tools = {};

/**
 * @param obj
 * @returns {string} boolean/number/string/function/array/date/regexp/undefined/null/object
 */
Tools.type = function type(obj) {
    return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1].toLowerCase();
};

// 复制对象
Tools.copy = function(data) {
    let t = Tools.type(data);
    let res;

    if (t === 'array') {
        // 复制数组
        res = [];
        for (let i = 0; i < data.length; i++) {
            res.push(Tools.copy(data[i]));
        }
    } else if (t === 'object') {
        // 复制对象，被拷贝原型上的属性
        res = {};
        Object.keys(data).forEach(i => {
            res[i] = Tools.copy(data[i]);
        });
    } else if (t === 'date') {
        // 复制时间
        res = new Date(data.getTime());
    } else if (t === 'regexp') {
        // 复制正则
        let arr = data.toString().split('/');
        res = new RegExp(arr.slice(1, -1).join('/'), arr.slice(-1)[0]);
    } else {
        res = data;
    }

    return res;
};

// 合并、拷贝对象
Tools.extend = function(...args) {

    if (args.length === 1) {
        return Tools.copy(args[0]); // 只有一个参数，则实现复制
    }

    let target = args[0] || {}; // 目标对象

    args.forEach((src, i) => {
        if (i === 0 || !src) { return; }

        Object.keys(src).forEach(key => {
            let sType = Tools.type(src[key]);
            let tType = Tools.type(target[key]);
            if ((sType === 'array' && tType === 'array') || (sType === 'object' && tType === 'object')) {
                // 都是数组或对象，需要继续深度合并
                Tools.extend(target[key], src[key]);
            } else if (src[key]) {
                // 其他情况，且src存在，直接复制后替换
                target[key] = Tools.copy(src[key]);
            }
        });
    });

    return target;
};

export default Tools;
